07 - Optyka i działanie kamer

Wprowadzenie do przetwarzania obrazów

Politechnika Poznańska, Instytut Robotyki i Inteligencji Maszynowej

Ćwiczenie laboratoryjne 7: optyka kamery oraz jej kalibracja

Powrót do spisu treści ćwiczeń laboratoryjnych

Wstęp

Podczas tego laboratorium poznasz fizyczne i optyczne cechy kamery USB. Dowiesz się, jak zmiana obiektywu wpływa na kąty widzenia kamery i jej ogniskową oraz jak manipulacja przesłoną wpływa na głębie ostrości i szybkość akwizycji obrazu. W kolejnym podrozdziale przeprowadzisz kalibrację kamery.

Dane

Pobierz paczkę ze skryptami do zadań.

Obiektywy


Źródło: Obiektywy w systemach telewizji dozorowej.

Zbadaj jak zmienia się obraz kamery przy zmianie ogniskowej jej obiektywu. Odpowiedz na pytania: * Jaką charakterystykę obrazu tracimy zwiększając ogniskową soczewki a jaką zyskujemy? * W jakich sytuacjach korzystne jest posiadanie bardzo szerokiego kąta widzenia?

Przysłona

Przysłona ma za zadanie ograniczać ilość światła wpadającego do obiektywu, a tym samym zapobiegać „prześwietlaniu” powstającego w kamerze obrazu. Regulując przesłonę, kontrolujemy ilość światła przechodzącego przez soczewki obiektywu. Jednocześnie wpływamy na głębie ostrości otrzymanego obrazu, ponieważ wyższa wartość przesłony powoduje wyższą głębię ostrości.

Zadanie
Uruchom skrypt scripts/07/shutter.py. Korzystając z pokrętła zmiany przesłony na kamerze (pierścień bez śruby), ustaw odpowiednią ilość wpadającego światła. Sprawdź, jak wpływa na obraz dodatkowe oświetlenie (możesz wykorzystać latarkę w telefonie), a jak jego niedobór.

Następnie zminiejszaj delikatnie rozwarcie soczewki i jednocześnie obserwuj liczbę klatek na sekundę. Zastanów się, skąd może wynikać taka zmiana?

Kalibracja kamery

Rejestratory obrazu mogą posiadać wady i niedoskonałości fabryczne, które sprawiają, że obraz jest zniekształcony. Najczęściej widocznym zniekształceniem jest efekt rybiego oka, który sprawia, że linie proste nie leżą w jednej linii. Efekt ten można zredukować, znajdując parametry wewnętrzne kamery, co nazywamy kalibracją.

Aby skutecznie przeprowadzić kalibrację kamery, potrzebny jest obiekt o znanych kształtach i rozmiarach. Najczęściej jest to jednak tablica z naniesioną szachownicą. W naszym przypadku jest to szachownica 8x5, gdyż liczymy wewnętrzne narożniki.

Znany wzorzec jest wielokrotnie rejestrowany, z możliwie różnych kątów oraz pozycji kamery, zwłaszcza na skrajnych częściach obrazu. Pozwoli to zróżnicować dane i dobrać najlepsze dopasowanie.

Jak liczyć wielkość macierzy kalibracyjnej?

Zadanie
Wykorzystaj skrypt scripts/07/calibration/1_collect_images.py do zebrania zbioru kalibracyjnego. Program został tak napisany, żeby po wciśnięciu klawisza spacja, zapisać obecną klatkę do katalogu frames. Zbierz między 40 a 80 zdjęć, postaraj się, by były one zróżnicowane i ostre. Klawisz q pozwoli zakończyń program.

Edytuj skrypt scripts/07/calibration/2_find_chessboard.py by ustawić zmienną GRID_SIZE odpowiadającą twojej tarczy kalibracyjnej, następnie uruchom go. Wyszuka on na każdym obrazie punkty charakterystyczne szachownicy oraz zwizualizuje. Następnie rozpocząnie się kalibracja (może potrwać to kilka minut przy większej liczbie zdjęć). Po prawidłowej kalibracji algorytm wypisze w terminalu parametry wewnętrzne kamery. Zachowaj je.

Uwaga: Optyka kamery powinna pozostać niezmieniona w trakcie zbierania zdjęć oraz po przeprowadzeniu procesu kalibracji. Każdorazowa zmiana parametrów wymaga zebrania nowego zestawu zdjęć oraz wykonania ponownej kalibracji.

Uzupełnij w skrypcie scripts/07/calibration/3_show_calibrated_camera.py słownik cfg korzystając z obliczonych parametrów wewnętrznych kamery. Uruchom skypt i korzystając z klawisza spacja zmień tryby wyświetlania. Czy obraz został w widoczny sposób poprawiony? Sprawdź czy zmiana głębi oraz zoomu w kamerze wymaga jej ponownej kalibracji.

Efekt przedstawiono na filmie.

Obraz pseudo-3D

Kalibracja kamery pozwala na wykorzystanie narzędzi wprowadzających pseudo obraz 3D, który jest podstawą rozszerzonej rzeczywistości (ang. augmented reality, AR). Prostym narzędziem wykorzystywanym w robotyce są kody aruco, do których są wbudowane w opencv metody ich detekcji, lokalizacji oraz deskrypcji. Przykładowe zastosowania przedstawiono tutaj, tutaj, tutaj i tutaj.

Zadanie
Upewnij się, że w swoim środowisku masz zainstalowaną bibliotekę opencv-contrib-python.

Wykorzystaj skrypt aruco_ar.py by wyświetlić modele sześcianów nałożonych na kody aruco. Twoim zadaniem jest wykorzystać informację o id wykrytego znacznika aruco_id oraz pokolorować boxa na różne kolory aruco_color.

Opcjonalnie
Pobierz na telefon plik pdf (lub kilka) z kodem Aruco i sprawdź ich działanie. Zastanów się, jakie widzisz zastosowanie w robotyce a jakie w automatyce? Przykładowy rezultat przedstawiono na filmie.

Sklejanie obrazów (panorama)

W opencv został zaimplementowany algorytm, który pozwala na dopasowanie wielu obrazów do siebie. Jest to klasa cv2.Stitcher_create, która wykonuje dla zdjęć następujące kroki: - wykrywa punkty charakterystyczne na obrazie i używa deskryptorów do ich opsu, - dopasowuje te punkty między obrazami na podstawie podobieństwa, - wykorzystuje dopasowane punkty oraz algorytm RANSAC do wyliczania macierzy przekształceń dla obrazów, by móc je dopasować do siebie - wykonuje sklejenie obrazów na podstawie macierzy przekształceń.

Więcej informacji o tym mechaniźmie można znaleźć w tym artykule.

Zadanie
Korzystając ze skrytpu image_stitching.py, zbierz pokrywajce się częściowo zdjęcia (przy użyciu klawisza spacji), a następnie wciśnij klawisz c, który rozpoczyna proces generowania panoramy. Zwróć uwagę na dokładoność łączenia na krawędziach. Uwaga: Zadanie dopasowywania cech jest bardzo zasobożerne, więc może długo trwać jeśli zostało wykonane wiele zdjęć.

Zadanie

Kalibracja kamery ma wiele zalet, pozwala na przykład estymować pozę kamery względem znacznika. Znacznik może być zefiniowany lub wykorzystywać można charakterystyczne cechy. Na tym filmiku możesz podejrzeć, jak drone jest automatycznie nakierowywany na znany mu znacznik do lądowania.

Twoim zadaniem będzie napisanie takiego programu, przy czym znaczna jego częśc jest już zaimplementowana. Przykładowe działanie możesz podejrzeć na tym nagraniu. Identyczny znacznik do testowania znajduje się nad waszymi głowami.

  1. W skrypcie track_position.py uzupełnij: